package guhong.play.commandsystem.job.file.sf;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.StrUtil;
import guhong.play.commandsystem.dto.entity.Command;
import guhong.play.commandsystem.dto.entity.CommandConfig;
import guhong.play.commandsystem.job.CommandJob;
import guhong.play.commandsystem.job.file.FileCommandConfig;
import guhong.play.commandsystem.util.print.PrintUtil;
import lombok.Data;

import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * @author : 李双凯
 * @date : 2019-11-20 22:32
 **/
@Data
public class SearchFileCommandJob implements CommandJob {


    @Override
    public CommandConfig getCommandConfig() {
        FileCommandConfig fileConfig = new FileCommandConfig("sf");
        fileConfig.setDescription("搜索文件");
        Map<String, Boolean> paramConfig = fileConfig.getParamConfig();
        // Matchmaker 匹配符，多个用,号隔开
        paramConfig.put("-m", true);
        // Path 路径
        paramConfig.put("-p", true);
        return fileConfig;
    }

    @Override
    public void run(Command command) {
        // -p和-m是必须的，否则直接结束
        if (!command.isExistParam("-p") || !command.isExistParam("-m")) {
            return;
        }
        String matchmaker = command.getParamValue("-m");
        String[] matchmakerArray = matchmaker.split(",");
        String path = command.getParamValue("-p");

        // 判断path是否存在
        if (!FileUtil.exist(path)) {
            PrintUtil.printLnError("路径不存在");
            return;
        }

        PrintUtil.println("开始搜索：");

        // 判断path是文件还是目录
        // 计数，记录匹配成功的次数
        AtomicInteger count = new AtomicInteger();

        if (FileUtil.isFile(path)) {
            count.getAndIncrement();
            printMatchResult(path, matchmakerArray);
        } else {
            FileUtil.loopFiles(path).forEach(file -> {
                String fileContent = readFile(file.getPath());
                String matchResult = getMatchResult(fileContent, matchmakerArray);
                if (matchResult != null) {
                    count.getAndIncrement();
                    PrintUtil.println(file.getPath() + ":--->" + matchResult);
                }
            });
        }

        PrintUtil.println("搜索结束");
        PrintUtil.println("匹配成功次数：" + count);

    }

    // 使用Hutool的工具类读取并返回文件内容
    private String readFile(String path) {
        if (!StrUtil.endWithAny(path, SUFFIX_LIST)) {
            return null;
        }
        return FileUtil.readUtf8String(path);
    }


    // 判断指定文本是否包含指定的字符（多个），只要满足一项则表示匹配，匹配成功返回匹配的字符，反之返回空
    private String getMatchResult(String text, String... matchmakerArray) {
        if (StrUtil.isBlank(text) || ArrayUtil.isEmpty(matchmakerArray)) {
            return null;
        }
        for (String matchmakerItem : matchmakerArray) {
            if (text.contains(matchmakerItem)) {
                return matchmakerItem;
            }
        }
        return null;
    }

    // 定义一个文件后缀列表，表示只读取这些类型的文件
    private static final String[] SUFFIX_LIST = new String[]{".txt", ".md"};

    // 判断指定文本是否包含指定的字符，如果有则打印，否则不打印
    private void printMatchResult(String path, String... matchmakerArray) {
        // 只读取指定后缀的文件
        if (!StrUtil.endWithAny(path, SUFFIX_LIST)) {
            return;
        }
        String fileContent = readFile(path);
        if (StrUtil.isBlank(fileContent)) {
            return;
        }
        String matchResult = getMatchResult(fileContent, matchmakerArray);
        if (matchResult != null) {
            PrintUtil.println(path + ":--->" + matchResult);
        }
    }

}
